package com.ssvendas.util;

import java.io.Serializable;
import java.util.*;

import com.ssvendas.modelo.Produto;

public class SimilarUtil implements Serializable{

	private static final long serialVersionUID = 1650861418028146117L;

	public static String geraProximoIDSimilar(Produto p){
		String chaveGerada = "";
		String teste = "ABCDEFGHIJKLMNOPQRSTUVXZ";
		String sufixo = "";
		
		for(int i = 0;i<p.getCodigo().length();i++){
			if(teste.contains(chaveGerada+p.getCodigo().charAt(i))){
				sufixo = sufixo + chaveGerada+p.getCodigo().charAt(i);
				break;
			}
			chaveGerada = chaveGerada+p.getCodigo().charAt(i);
		}
		
		char sufixoChar = sufixo.toCharArray()[0];
		
		return (chaveGerada+""+sufixoChar+1);
	}
	
	public static String tiraSufixo(Produto p){
		String chave = "";
		String teste = "ABCDEFGHIJKLMNOPQRSTUVXZ";
		
		for(int i = 0;i<p.getCodigo().length();i++){
			if(teste.contains(chave+p.getCodigo().charAt(i))){
				break;
			}
			chave = chave+p.getCodigo().charAt(i);
		}
		return chave;
	}
	
	@SuppressWarnings("rawtypes")
	public static List<String> obterStrings(String busca) {

		String[] tokens = busca.split(" ");
		List<SortedSet<Comparable>> conjuntos = gerarCombinacoes(tokens);
		List<String> buscas = new ArrayList<String>();
		List<String> tokensLista = new ArrayList<String>();
		for (int i = 0; i < tokens.length; ++i) {
			tokensLista.add(tokens[i]);
		}
		List<StringPonderada> buscasPonderadas = new ArrayList<StringPonderada>();
		List<String> elementos = new ArrayList<String>();
		for (SortedSet<Comparable> s : conjuntos) {

			StringPonderada strPonderada = new StringPonderada();
			for (int i = 0; i < s.toArray().length; ++i) {
				elementos.add(s.toArray()[i].toString());
			}
			for (String e : elementos) {

				strPonderada = strPonderada.concat(new StringPonderada(e,
						(tokensLista.size() - tokensLista.indexOf(e)) * 10));

				strPonderada = strPonderada.concat(new StringPonderada(" ", 0));

			}
			elementos.clear();
			buscasPonderadas.add(strPonderada);
			Collections.sort(buscasPonderadas);
			buscas.clear();
			for (StringPonderada p : buscasPonderadas) {
				buscas.add(p.getElemento());
			}

		}

		return buscas;
	}
	
	@SuppressWarnings("rawtypes")
	public static List<SortedSet<Comparable>> gerarCombinacoes(String[] gerador) {

		List<SortedSet<Comparable>> combinacoes = new ArrayList<SortedSet<Comparable>>();

		for (String s : gerador) {
			combinacoes.add(new TreeSet<Comparable>(Arrays.asList(s)));
		}

		for (int nivel = 1; nivel < gerador.length; nivel++) {
			List<SortedSet<Comparable>> statusAnterior = new ArrayList<SortedSet<Comparable>>(
					combinacoes);
			for (Set<Comparable> antes : statusAnterior) {
				SortedSet<Comparable> novo = new TreeSet<Comparable>(antes);
				novo.add(gerador[nivel]);
				if (!combinacoes.contains(novo)) {
					combinacoes.add(novo);
				}
			}
		}

		return combinacoes;
	}
	
	
}


class StringPonderada implements Comparable<StringPonderada> {
	private String elemento;
	private int peso;
	
	public StringPonderada() {
		super();
		this.elemento = new String();
		this.peso = 0;
	}
	public StringPonderada(String elemento, int peso) {
		super();
		this.elemento = elemento;
		this.peso = peso;
	}

	@Override
	public int compareTo(StringPonderada outraString) {
		if (this.peso > outraString.peso)
			return -1;
		else if (this.peso < outraString.peso)
			return 1;
		else
			return 0;
	}
	
	public StringPonderada concat(StringPonderada str) {
		return new StringPonderada(this.elemento.concat(str.getElemento()),
				this.peso + str.peso);
	}

	public String getElemento() {
		return elemento;
	}

	public void setElemento(String elemento) {
		this.elemento = elemento;
	}

	public int getPeso() {
		return peso;
	}

	public void setPeso(int peso) {
		this.peso = peso;
	}

}


